package com.fqy.ticket.batch.config;

import jakarta.annotation.Resource;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.stereotype.Component;

/**
 * 自定义Quartz作业工厂，用于解决Quartz作业无法自动注入Spring Bean的问题。
 * 继承Spring提供的SpringBeanJobFactory，并覆盖实例化逻辑，确保Spring的依赖注入机制能应用于Quartz作业。
 */
@Component
public class MyJobFactory extends SpringBeanJobFactory {

    /**
     * Spring的自动装配Bean工厂，用于手动执行依赖注入。
     * 由于Quartz默认通过反射创建作业实例，这些实例不在Spring容器管理范围内，
     * 因此需要使用此工厂为作业实例手动注入Spring管理的Bean。
     */
    @Resource
    private AutowireCapableBeanFactory beanFactory;

    /**
     * 重写作业实例创建方法，在Quartz创建作业实例后，通过Spring完成依赖注入。
     *
     * @param bundle 触发器触发时的上下文信息，包含作业类名、参数等元数据
     * @return 完成依赖注入的作业实例
     * @throws Exception 创建过程中可能发生的异常
     */
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 1. 调用父类的默认逻辑创建作业实例（此时实例已创建，但依赖尚未注入）
        Object jobInstance = super.createJobInstance(bundle);

        // 2. 使用Spring的自动装配工厂为作业实例注入依赖（如@Autowired标注的Service、Repository等）
        beanFactory.autowireBean(jobInstance);

        // 3. 返回已完成依赖注入的作业实例
        return jobInstance;
    }
}
